/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package control;

import java.awt.Image;
import java.io.IOException;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import nexus.adec.GestorEspacioDB;
import nexus.adec.Usuario;
import org.apache.myfaces.custom.fileupload.UploadedFile;

/**
 *
 * @author juampi
 */
public class PerfilUsuario {
    private Usuario usuario;
    private boolean cambiarContrasenia;
    private boolean cambiarImagen;
    private boolean cambiarDatosPersonales;

    private String antContrasena;
    private String nuevoContrasena;
    private String repNuevoContrasena;
    private UploadedFile _upFile;
    private Image foto;
    GestorEspacioDB dbms;

    private boolean imagenSubida;
    private boolean imagenFallida;

    private boolean datosActualizados;
    private boolean errorDatos;
    private boolean errorPassword;
    private boolean passwordActualizado;
    public PerfilUsuario(){
        cambiarContrasenia=true;
        cambiarImagen=true;
      
        FacesContext faces=FacesContext.getCurrentInstance();
        UserBean login=(UserBean)faces.getApplication().getVariableResolver().resolveVariable(faces,"userBean");
        usuario=GestorEspacioDB.getInstance().obtenerUsuario(login.getId());
    }
    /**
     * @return the usuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the cambiarContrasenia
     */
    public boolean isCambiarContrasenia() {
        return cambiarContrasenia;
    }

    /**
     * @param cambiarContrasenia the cambiarContrasenia to set
     */
    public void setCambiarContrasenia(boolean cambiarContrasenia) {
        this.cambiarContrasenia = cambiarContrasenia;
    }

    /**
     * @return the cambiarImagen
     */
    public boolean isCambiarImagen() {
        return cambiarImagen;
    }

    /**
     * @param cambiarImagen the cambiarImagen to set
     */
    public void setCambiarImagen(boolean cambiarImagen) {
        this.cambiarImagen = cambiarImagen;
    }

    /**
     * @return the cmabiarDatosPersonales
     */
    public boolean isCambiarDatosPersonales() {
        return cambiarDatosPersonales;
    }

    /**
     * @param cmabiarDatosPersonales the cmabiarDatosPersonales to set
     */
    public void setCambiarDatosPersonales(boolean cmabiarDatosPersonales) {
        this.cambiarDatosPersonales = cmabiarDatosPersonales;
    }
     public String upload() throws IOException
    {
         try {
            GestorEspacioDB.getInstance().guardarImagen(usuario.getNombreUsuario(),_upFile.getBytes());
            imagenSubida=true;
            imagenFallida=false;
            errorPassword=false;
            passwordActualizado=false;
            datosActualizados=false;
            errorDatos=false;
            FacesMessage mensaje=new FacesMessage("La imagen se cambio correctamente","La imagen se cambio correctamente");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
        } catch (Exception ex) {
            imagenSubida=false;
            imagenFallida=true;
            errorPassword=false;
            passwordActualizado=false;
            datosActualizados=false;
            errorDatos=false;
            FacesMessage mensaje=new FacesMessage("Error a subir la imagen","Error a subir la imagen");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
        }
        return "ok";
    }

    public boolean isUploaded()
    {
        return true;
    }

    /**
     * @return the antContrasena
     */
    public String getAntContrasena() {
        return antContrasena;
    }

    /**
     * @param antContrasena the antContrasena to set
     */
    public void setAntContrasena(String antContrasena) {
        this.antContrasena = antContrasena;
    }

    /**
     * @return the nuevoContrasena
     */
    public String getNuevoContrasena() {
        return nuevoContrasena;
    }

    /**
     * @param nuevoContrasena the nuevoContrasena to set
     */
    public void setNuevoContrasena(String nuevoContrasena) {
        this.nuevoContrasena = nuevoContrasena;
    }

    /**
     * @return the repNuevoContrasena
     */
    public String getRepNuevoContrasena() {
        return repNuevoContrasena;
    }

    /**
     * @param repNuevoContrasena the repNuevoContrasena to set
     */
    public void setRepNuevoContrasena(String repNuevoContrasena) {
        this.repNuevoContrasena = repNuevoContrasena;
    }
    public void guardarCambios(){
        try{
            GestorEspacioDB.getInstance().actualizarUsuario(usuario);
            FacesMessage faces=new FacesMessage("Los datos personales se cambiaron correctamente");
            FacesContext.getCurrentInstance().addMessage(null,faces);
            imagenSubida=false;
            imagenFallida=false;
            errorPassword=false;
            passwordActualizado=false;
            datosActualizados=true;
            errorDatos=false;
        }catch(Exception e){
            imagenSubida=false;
            imagenFallida=false;
            errorPassword=false;
            passwordActualizado=false;
            datosActualizados=false;
            errorDatos=true;
        }
    }
    public void cambiarContra(){
        FacesMessage mensaje;
        if(nuevoContrasena.equals(repNuevoContrasena)){
            if(GestorEspacioDB.getInstance().login(usuario.getNombreUsuario(),antContrasena)){
                FacesMessage faces=new FacesMessage("Error la Contraseña anterior no coincide","Error la Contraseña anterior no coincide");
                FacesContext.getCurrentInstance().addMessage(null,faces);
            }
            boolean res=GestorEspacioDB.getInstance().cambiarPassword(usuario.getNombreUsuario(), antContrasena, nuevoContrasena);
            FacesMessage faces=new FacesMessage("La Contraseña fue cambiada con exitos","La Contraseña fue cambiada con exitos");
            FacesContext.getCurrentInstance().addMessage(null,faces);
            if(!res){
                imagenSubida=false;
                imagenFallida=false;
                errorPassword=true;
                passwordActualizado=false;
                datosActualizados=false;
                errorDatos=false;
            }else{
                imagenSubida=false;
                imagenFallida=false;
                errorPassword=false;
                passwordActualizado=true;
                datosActualizados=false;
                errorDatos=false;
            }
        }else{
            FacesMessage faces=new FacesMessage("Error al cambiar la contraseña nueva contraseña y repeticion de la nueva contraseña no coinciden","Error al cambiar la contraseña nueva contraseña y repeticion de la nueva contraseña no coinciden");
            FacesContext.getCurrentInstance().addMessage(null,faces);
            imagenSubida=false;
            imagenFallida=false;
            errorPassword=true;
            passwordActualizado=false;
            datosActualizados=false;
            errorDatos=false;
            mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR,"errorNoCoincidenContrasenas", "");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
        }
    }
    public void guardarIma(){
    }
    /**
     * @return the foto
     */
    public Image getFoto() {
        return foto;
    }

    /**
     * @param foto the foto to set
     */
    public void setFoto(Image foto) {
        this.foto = foto;
    }
    public void showImage(){
        try {
            byte[] bytes=dbms.recuperarImagen(usuario.getNombreUsuario());
            // Get response.
            FacesContext context = FacesContext.getCurrentInstance();
            HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

            // Write image contents to response.
            response.setContentType("image/jpeg");
            response.setContentLength(bytes.length);
            response.getOutputStream().write(bytes);
            context.responseComplete();
        } catch (IOException e) {
            System.out.println("Showing image failed, I/O error");
        }
    }

    /**
     * @return the imagenSubida
     */
    public boolean isImagenSubida() {
        return imagenSubida;
    }

    /**
     * @param imagenSubida the imagenSubida to set
     */
    public void setImagenSubida(boolean imagenSubida) {
        this.imagenSubida = imagenSubida;
    }

    /**
     * @return the imagenFallida
     */
    public boolean isImagenFallida() {
        return imagenFallida;
    }

    /**
     * @param imagenFallida the imagenFallida to set
     */
    public void setImagenFallida(boolean imagenFallida) {
        this.imagenFallida = imagenFallida;
    }

    /**
     * @return the upFile
     */
    public UploadedFile getUpFile() {
        return _upFile;
    }

    /**
     * @param upFile the upFile to set
     */
    public void setUpFile(UploadedFile upFile) {
        this._upFile = upFile;
    }

    /**
     * @return the datosActualizados
     */
    public boolean isDatosActualizados() {
        return datosActualizados;
    }

    /**
     * @param datosActualizados the datosActualizados to set
     */
    public void setDatosActualizados(boolean datosActualizados) {
        this.datosActualizados = datosActualizados;
    }

    /**
     * @return the errorDatos
     */
    public boolean isErrorDatos() {
        return errorDatos;
    }

    /**
     * @param errorDatos the errorDatos to set
     */
    public void setErrorDatos(boolean errorDatos) {
        this.errorDatos = errorDatos;
    }

    /**
     * @return the errorPassword
     */
    public boolean isErrorPassword() {
        return errorPassword;
    }

    /**
     * @param errorPassword the errorPassword to set
     */
    public void setErrorPassword(boolean errorPassword) {
        this.errorPassword = errorPassword;
    }

    /**
     * @return the passwordActualizado
     */
    public boolean isPasswordActualizado() {
        return passwordActualizado;
    }

    /**
     * @param passwordActualizado the passwordActualizado to set
     */
    public void setPasswordActualizado(boolean passwordActualizado) {
        this.passwordActualizado = passwordActualizado;
    }

}
    